package cn.jsj.onclock.service;

import cn.jsj.onclock.aop.PrimaryKeyParam;
import cn.jsj.onclock.pojo.UserEnt;
import cn.jsj.onclock.pojo.identity.UserIdentityEnum;
import org.hibernate.validator.constraints.Length;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * @author 卢斌
 */
@Validated
public interface UserService {


    /**
     * 用户登录与注册；
     * - 存在用户信息则登录，数据库中如果没有该用户的openId则先完成基础的注册
     *
     * @param code  登录code
     * @return  token
     */
    String userLogin(@NotBlank@Length(max = 128) String code);


    /**
     * 获取用户个人基本信息
     *
     * @param userId    用户Id
     * @return  该用户的个人信息实体
     */
    UserEnt getUserInfo(@PrimaryKeyParam Long userId);


    /**
     * 新增一个用户，仅包含openId信息和默认用户角色
     *
     * @param openId    用户openId
     */
    void initRegister(@NotBlank@Length(max = 128) String openId);


    /**
     * 更新用户的个人信息
     *
     * @param userId            用户Id
     * @param name              用户新姓名
     * @param teleNumber        用户手机号
     * @param orgDescription    机构简介
     */
    void updateUserInformation(@PrimaryKeyParam Long userId, @Length(max = 8) String name, @Length(min = 11, max = 11) String teleNumber, @Length(max = 12) String orgDescription);


    /**
     * 用户更换头像
     *
     * @param userId        用户Id
     * @param pictureFile   用户上传的文件
     */
    void saveUserHeadPicture(@PrimaryKeyParam Long userId, @NotNull MultipartFile pictureFile);


    /**
     * 获取用户上传的头像
     *
     * @param userId    用户Id
     * @param response  httpServletResponse
     */
    void getUserHeadPicture(@PrimaryKeyParam Long userId, HttpServletResponse response);


    /**
     * 生成一个六位整数，用于超级管理员登录PC端后端，作为超管用户登录的安全码
     *
     * @param userId        用户Id
     * @param userIdentity  用户身份信息
     * @return  安全码
     */
    Integer createSuperAdminLoginSecurityCode(@NotNull@Min(value = 1) Long userId, @NotNull UserIdentityEnum userIdentity);


}
